let data = { //返回的数据类型格式
  "approveVersion": Number, //审批流版本
  "tableId": Number,//审批订单id
  "workFlowDef": {
    "type": Number, // 审批类型  1-调休审批 | 2-请假审批 | 3-入职审批 | 4-离职审批 ...
    "name": String,//审批名称 -- 合同审批 | 调休审批...
  },
  "directorMaxLevel": Number,//审批主管最大层级 1-总经理 | 2-部门经理 | 3-部门主管...
  "flowPermission": Array,//发起人--[{name:xxx;id:111},{name:xxx;id:222}] 发起人可多个一起申请
  "nodeConfig": { // 节点配置
    "nodeName": String,// 节点名称--发起人 | 审批人...
    "type": Number,// 节点类型--0-发起人 | 1-审批 | 2-抄送 | 3-条件 | 4-条件分支...
    "priorityLevel": Number,// 条件优先级
    "settype": Number,// 审批人设置--1-指定成员 | 2-主管 | 3-直属上级 | 4-发起人自选 | 5-发起人自己 | 6-连续多级主管
    "selectMode": Number, // 审批人数--1-一人审批 | 2-多人审批
    "selectRange": Number, // 选择范围--1-全公司 | 2-指定部门 | 3-指定角色
    "directorLevel": Number, // 审批终点  最高层主管数????
    "examineMode": Number, // 多人审批时采用的审批方式--1-依次审批 | 2-会签
    "noHanderAction": Number,// 审批人为空时的处理-- 1-自动审批通过 | 2-审批自动拒绝 | 3-转交给审核管理员 | 4-不允许发起审批
    "examineEndDirectorLevel": "", //审批终点 第n层主管?????
    "ccSelfSelectFlag": Boolean, // 是否允许发起人自选抄送人
    "conditionList": [], // 当审批单同时满足以下条件时进入此流程 详细展开内容见下面
    "nodeUserList": Array, // 操作人--[{name:xxx;id:111,time:2023-3-16},{name:xxx;id:222,time:2023-3-16}] 
    "childNode": {
      "nodeName": "审核人",
      "error": false, //当前审批是否通过校验
      "type": 1,
      "settype": 2,
      "selectMode": 0,
      "selectRange": 0,
      "directorLevel": 1,
      "examineMode": 1,
      "noHanderAction": 2,
      "examineEndDirectorLevel": 0,
      "childNode": {
        "nodeName": "条件分支",
        "type": 4,
        "priorityLevel": 1,
        "settype": 1,
        "selectMode": 0,
        "selectRange": 0,
        "directorLevel": 1,
        "examineMode": 1,
        "noHanderAction": 2,
        "examineEndDirectorLevel": 1,
        "ccSelfSelectFlag": 1,
        "conditionList": [],
        "nodeUserList": [],
        "childNode": {
          "nodeName": "抄送人",
          "type": 2,
          "ccSelfSelectFlag": 1,
          "childNode": null,
          "nodeUserList": [],
          "error": false
        },
        "conditionNodes": [{ //条件节点
          "nodeName": "条件1",
          "type": 3,
          "priorityLevel": 1,
          "settype": 1,
          "selectMode": 0,
          "selectRange": 0,
          "directorLevel": 1,
          "examineMode": 1,
          "noHanderAction": 2,
          "examineEndDirectorLevel": 1,
          "ccSelfSelectFlag": 1,
          "conditionList": [{ // 当前条件列表，array类型，具体条件参数对象格式展示
            "columnId": Number, // 列表id--删除的时候用
            "type": Number, // 条件类型--  1-发起人 | 2-其他...
            "optType": Number | String, // 条件选项数学运算符--1-"" | 2-< | 3->...
            "zdy1": String,// 左侧自定义内容 选择小于等于介于二者之间等有回显
            "zdy2": String,// 右侧自定义内容 选择小于等于介于二者之间等有回显
            "opt1": String,// 左侧符号 < ≤ 选择小于等于介于二者之间等有回显
            "opt2": String,// 右侧符号 < ≤ 选择小于等于介于二者之间等有回显
            "columnDbname": String,// 条件字段名称
            "columnType": String,// 条件字段类型 ???
            "showType": String,// 表单组件类型  checkBox | input | radio...
            "showName": String,// 条件组件展示名
            "fixedDownBoxValue": Array// 多选条件数组--[{name:xxx;value:1,type:1},{name:xxx;value:1,type:1}]
          }],
          "nodeUserList": [{
            "targetId": 85,
            "type": 1,
            "name": "天旭"
          }],
          "childNode": {
            "nodeName": "审核人",
            "type": 1,
            "priorityLevel": 1,
            "settype": 1,
            "selectMode": 0,
            "selectRange": 0,
            "directorLevel": 1,
            "examineMode": 1,
            "noHanderAction": 2,
            "examineEndDirectorLevel": 1,
            "ccSelfSelectFlag": 1,
            "conditionList": [],
            "nodeUserList": [{
              "targetId": 2515744,
              "type": 1,
              "name": "哈哈哈哈"
            }],
            "childNode": null,
            "conditionNodes": [],
            "error": false
          },
          "conditionNodes": [],
          "error": false
        }, {
          "nodeName": "条件2",
          "type": 3,
          "priorityLevel": 2,
          "settype": 1,
          "selectMode": 0,
          "selectRange": 0,
          "directorLevel": 1,
          "examineMode": 1,
          "noHanderAction": 2,
          "examineEndDirectorLevel": 1,
          "ccSelfSelectFlag": 1,
          "conditionList": [],
          "nodeUserList": [],
          "childNode": null,
          "conditionNodes": [],
          "error": false
        }]
      },
      "nodeUserList": []
    },
    "conditionNodes": []
  }
}


// 其他数据结构
 let data1 = [ // 返回数据为数组格式，每个节点为一个对象，根据节点顺序排列
  { // 主节点--选择审核类型
    parentId: '', // 父级id
    nodeType: 1, // 节点类型
    nodeSequence: 1, // 节点顺序
    nodeName: '请假审批', // 节点名称
    nodeId: 111, // 节点id编号
  },
  { // 发起人节点
    parentId: '', // 父级id
    nodeType: 2, // 节点类型
    nodeSequence: 2, // 节点顺序
    nodeName: '发起人', // 节点名称
    nodeId: 112, // 节点id编号
    initiatorMore: true, // 是否可以选择多个发起人
    selectRange: 1, // 选择相关工作人员的范围--1-全公司 | 2-指定部门 | 3-指定角色
  },
  { // 审批人节点
    parentId: '', // 父级id
    nodeType: 3, // 节点类型
    nodeSequence: 3, // 节点顺序
    nodeName: '审批人', // 节点名称
    nodeId: 113, // 节点id编号
    settype: 1,// 审批人设置--1-指定成员 | 2-主管 | 3-直属上级 | 4-发起人自选 | 5-发起人自己 | 6-连续多级主管
    selectMode: 1, // 审批人数--1-一人审批 | 2-多人审批
    examineMode: 1, // 多人审批时采用的审批方式--1-依次审批 | 2-会签
    noHanderAction: 1,// 审批人为空时的处理-- 1-自动审批通过 | 2-审批自动拒绝 | 3-转交给审核管理员 | 4-不允许发起审批
    selectRange: 1, // 选择相关工作人员的范围--1-全公司 | 2-指定部门 | 3-指定角色
    conditionID: nodeId, //
  },
  { // 条件节点
    parentId: '', // 父级id
    nodeType: 4, // 节点类型
    nodeSequence: 4, // 节点顺序（节点类型为条件节点和节点顺序相同的情况，为条件并排）
    nodeName: '条件1', // 节点名称
    nodeId: 114, // 节点id编号
    priorityLevel: 1,// 条件的优先级
    conditionList: [{ // 当前条件列表，array类型，具体条件参数对象格式展示
      "columnId": Number, // 列表id--删除的时候用
      "type": Number, // 条件类型--  1-发起人 | 2-其他...
      "optType": Number | String, // 条件选项数学运算符--1-"" | 2-< | 3->...
      "zdy1": String,// 左侧自定义内容 选择小于等于介于二者之间等有回显
      "zdy2": String,// 右侧自定义内容 选择小于等于介于二者之间等有回显
      "opt1": String,// 左侧符号 < ≤ 选择小于等于介于二者之间等有回显
      "opt2": String,// 右侧符号 < ≤ 选择小于等于介于二者之间等有回显
      "columnDbname": String,// 条件字段名称
      "columnType": String,// 条件字段类型 ???
      "showType": String,// 表单组件类型  checkBox | input | radio...
      "showName": String,// 条件组件展示名
      "fixedDownBoxValue": Array// 多选条件数组--[{name:xxx;value:1,type:1},{name:xxx;value:1,type:1}]
    }],
  },
  { // 条件节点
    parentId: '', // 父级id
    nodeType: 4, // 节点类型
    nodeSequence: 4, // 节点顺序（节点类型为条件节点和节点顺序相同的情况，为条件并排）
    nodeName: '条件2', // 节点名称
    nodeId: 115, // 节点id编号
    priorityLevel: 2,// 条件的优先级
    conditionList: [{ // 当前条件列表，array类型，具体条件参数对象格式展示
      "columnId": Number, // 列表id--删除的时候用
      "type": Number, // 条件类型--  1-发起人 | 2-其他...
      "optType": Number | String, // 条件选项数学运算符--1-"" | 2-< | 3->...
      "zdy1": String,// 左侧自定义内容 选择小于等于介于二者之间等有回显
      "zdy2": String,// 右侧自定义内容 选择小于等于介于二者之间等有回显
      "opt1": String,// 左侧符号 < ≤ 选择小于等于介于二者之间等有回显
      "opt2": String,// 右侧符号 < ≤ 选择小于等于介于二者之间等有回显
      "columnDbname": String,// 条件字段名称
      "columnType": String,// 条件字段类型 ???
      "showType": String,// 表单组件类型  checkBox | input | radio...
      "showName": String,// 条件组件展示名
      "fixedDownBoxValue": Array// 多选条件数组--[{name:xxx;value:1,type:1},{name:xxx;value:1,type:1}]
    }],
  },
  { // 条件节点
    parentId: '115', // 父级id （找nodeId为115的进行插入）
    nodeType: 4, // 节点类型
    nodeSequence: 5, // 节点顺序（节点类型为条件节点和节点顺序相同的情况，为条件并排）
    nodeName: '条件2', // 节点名称
    nodeId: 116, // 节点id编号
    priorityLevel: 2,// 条件的优先级
    conditionList: [{ // 当前条件列表，array类型，具体条件参数对象格式展示
      "columnId": Number, // 列表id--删除的时候用
      "type": Number, // 条件类型--  1-发起人 | 2-其他...
      "optType": Number | String, // 条件选项数学运算符--1-"" | 2-< | 3->...
      "zdy1": String,// 左侧自定义内容 选择小于等于介于二者之间等有回显
      "zdy2": String,// 右侧自定义内容 选择小于等于介于二者之间等有回显
      "opt1": String,// 左侧符号 < ≤ 选择小于等于介于二者之间等有回显
      "opt2": String,// 右侧符号 < ≤ 选择小于等于介于二者之间等有回显
      "columnDbname": String,// 条件字段名称
      "columnType": String,// 条件字段类型 ???
      "showType": String,// 表单组件类型  checkBox | input | radio...
      "showName": String,// 条件组件展示名
      "fixedDownBoxValue": Array// 多选条件数组--[{name:xxx;value:1,type:1},{name:xxx;value:1,type:1}]
    }],
  },
  { // 条件节点
    parentId: '115', // 父级id （找nodeId为115的进行插入）
    nodeType: 4, // 节点类型
    nodeSequence: 5, // 节点顺序（节点类型为条件节点和节点顺序相同的情况，为条件并排）
    nodeName: '条件2', // 节点名称
    nodeId: 117, // 节点id编号
    priorityLevel: 2,// 条件的优先级
    conditionList: [{ // 当前条件列表，array类型，具体条件参数对象格式展示
      "columnId": Number, // 列表id--删除的时候用
      "type": Number, // 条件类型--  1-发起人 | 2-其他...
      "optType": Number | String, // 条件选项数学运算符--1-"" | 2-< | 3->...
      "zdy1": String,// 左侧自定义内容 选择小于等于介于二者之间等有回显
      "zdy2": String,// 右侧自定义内容 选择小于等于介于二者之间等有回显
      "opt1": String,// 左侧符号 < ≤ 选择小于等于介于二者之间等有回显
      "opt2": String,// 右侧符号 < ≤ 选择小于等于介于二者之间等有回显
      "columnDbname": String,// 条件字段名称
      "columnType": String,// 条件字段类型 ???
      "showType": String,// 表单组件类型  checkBox | input | radio...
      "showName": String,// 条件组件展示名
      "fixedDownBoxValue": Array// 多选条件数组--[{name:xxx;value:1,type:1},{name:xxx;value:1,type:1}]
    }],
  },
  { // 审批人节点
    parentId: ['117','116'], // 父级id数组格式并且长度大于一，代表条件汇总节点
    nodeType: 3, // 节点类型
    nodeSequence: 6, // 节点顺序
    nodeName: '审批人', // 节点名称
    nodeId: 118, // 节点id编号
    settype: 1,// 审批人设置--1-指定成员 | 2-主管 | 3-直属上级 | 4-发起人自选 | 5-发起人自己 | 6-连续多级主管
    selectMode: 1, // 审批人数--1-一人审批 | 2-多人审批
    examineMode: 1, // 多人审批时采用的审批方式--1-依次审批 | 2-会签
    noHanderAction: 1,// 审批人为空时的处理-- 1-自动审批通过 | 2-审批自动拒绝 | 3-转交给审核管理员 | 4-不允许发起审批
    selectRange: 1, // 选择相关工作人员的范围--1-全公司 | 2-指定部门 | 3-指定角色
    conditionID: nodeId, //
  },
  { // 审批人节点
    parentId: ['117'], // 父级id
    nodeType: 3, // 节点类型
    nodeSequence: 6, // 节点顺序
    nodeName: '审批人', // 节点名称
    nodeId: 118, // 节点id编号
    settype: 1,// 审批人设置--1-指定成员 | 2-主管 | 3-直属上级 | 4-发起人自选 | 5-发起人自己 | 6-连续多级主管
    selectMode: 1, // 审批人数--1-一人审批 | 2-多人审批
    examineMode: 1, // 多人审批时采用的审批方式--1-依次审批 | 2-会签
    noHanderAction: 1,// 审批人为空时的处理-- 1-自动审批通过 | 2-审批自动拒绝 | 3-转交给审核管理员 | 4-不允许发起审批
    selectRange: 1, // 选择相关工作人员的范围--1-全公司 | 2-指定部门 | 3-指定角色
    conditionID: nodeId, //
  },
  { // 抄送节点
    nodeType: 3, // 节点类型
    nodeSequence: 6, // 节点顺序
    nodeName: '抄送人', // 节点名称
    nodeId: 116, // 节点id编号
    ccSelfSelectFlag: true, // 是否允许发起人自选抄送人
    selectRange: 1, // 选择相关工作人员的范围--1-全公司 | 2-指定部门 | 3-指定角色
  },
 ]


//  根据这种数据结构能想到的新增节点操作  根据节点顺序来判断当前新增的节点应该处于什么位置，将当前序号以及比当前序号大的序列标识加一，若新插入节点为条件节点并且有parentId，那么就给当前分支下的节点，以及没有parentId的非条件节点进行顺序加一

// let query = {
//   nodeType: 3, // 节点类型
//   nodeSequence: 3, // 节点顺序
//   nodeName: '审批人', // 节点名称
//   ...
// }


// 也可以根据父子关系进行插入渲染  数据结构保持第一种的树状结构，新增节点id，每次插入或删除时，传递parentId为被插入节点id


// 版本控制是需要有的操作，类似于订单逻辑，每次更改流程发布后，创建一笔新的订单，审批中未完成的审批流保持之前的流程不受影响，新建的审批走新的审批流程



// 每次退回的时候就去查 当前节点的父节点，同时父节点如果有条件节点，同时需要遍历条件节点里面的子节点


// 首先要有起始节点和结束节点  所有流程节点都要有一个key值  跑起来的基本目标  明确当前的节点key值（每次有动作时要保存一条记录，就能根据key值渲染到正在执行的节点） 中间节点有from和to两个字段表明来源和去向
//  每次新增节点需要传递当前新增位置的from和to，同时将传入的from的to字段改为当前节点，传入的to的from字段改为当前节点，当处理并排审核的时候，每个审核应该有审核状态字段，当下次进来的时候应该判断是否全部为已审核状态

/* 流程操作定义  首先是流程的状态 （发起审批，正在审批，审批完成）同时正在审批需要有 正在审批的节点id 每个节点需要有是否审批中字段



 */